#include <iostream>
#include <cstdlib>
#include <ctime>
#include "BlockQueue.hpp"

using namespace std;

void *runProducer(void *arg)
{
    yui::BlockQueue<int> *bq = static_cast<yui::BlockQueue<int> *>(arg);
    while (true)
    {
        sleep(1);
        int num = rand() % 100;
        bq->push(num);
        cout << "生产者生产了一个数据:" << num << endl;
        cout << "--------------------------" << endl;
    }
    pthread_exit((void *)0); // 退出线程
}

void *runConsumer(void *arg)
{
    yui::BlockQueue<int> *bq = static_cast<yui::BlockQueue<int> *>(arg);
    while (true)
    {
        // sleep(1);
        int num = 0;
        bq->pop(&num);
        cout << "消费者消费了一个数据:" << num << endl;
        cout << "-------------------------" << endl;
    }
    pthread_exit((void *)0); // 退出线程
}

int main()
{
    srand((unsigned int)time(nullptr));
    yui::BlockQueue<int> *bq = new yui::BlockQueue<int>(5); // 创建阻塞队列
    // 创建生产消费者线程
    pthread_t pro[2];
    pthread_t con[3];
    for(int i = 0; i < 2; i++)
        pthread_create(pro + i, nullptr, runProducer, bq);

    for(int i = 0; i < 3; i++)
        pthread_create(con + i, nullptr, runConsumer, bq);
    
    for(int i = 0; i < 2; i++)
        pthread_join(pro[i], nullptr);
    for(int i = 0; i < 3; i++)
        pthread_join(con[i], nullptr);
    // if (pthread_create(&producer, nullptr, runProducer, bq) < 0)
    // {
    //     perror("线程创建失败");
    //     return 1;
    // }
    // if (pthread_create(&consumer, nullptr, runConsumer, bq) < 0)
    // {
    //     perror("线程创建失败");
    //     return 1;
    // }
    // if(pthread_join(producer,nullptr)<0){
    //     perror("线程回收失败！");
    //     return 1;
    // }
    //     if(pthread_join(consumer,nullptr)<0){
    //     perror("线程回收失败！");
    //     return 1;
    // }
    delete bq;
    return 0;
}